/*
 * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.pept.transport;

import java.io.IOException;

import com.sun.corba.se.pept.encoding.InputObject;
import com.sun.corba.se.pept.encoding.OutputObject;
import com.sun.corba.se.pept.protocol.MessageMediator;
import com.sun.corba.se.pept.transport.EventHandler;


/**
 * <p><code>Connection</code> represents a <em>transport</em> in the
 * PEPt architecture.</p>
 *
 * @author Harold Carr
 */
public interface Connection {

  /**
   * Used to determine if the <code>Connection</code> should register
   * with the
   * {@link com.sun.corba.se.pept.transport.TransportManager
   * TransportManager}
   * {@link com.sun.corba.se.pept.transport.Selector Selector}
   * to handle read events.
   *
   * For example, an HTTP transport would not register since the requesting
   * thread would just block on read when waiting for the reply.
   *
   * @return <code>true</code> if it should be registered.
   */
  public boolean shouldRegisterReadEvent();

  /**
   * Used to determine if the <code>Connection</code> should register
   * with the
   * {@link com.sun.corba.se.pept.transport.TransportManager
   * TransportManager}
   * {@link com.sun.corba.se.pept.transport.Selector Selector}
   * to handle read events.
   *
   * For example, an HTTP transport would not register since the requesting
   * thread would just block on read when waiting for the reply.
   *
   * @return <code>true</code> if it should be registered.
   */
  public boolean shouldRegisterServerReadEvent(); // REVISIT - why special?

  /**
   * Called to read incoming messages.
   *
   * @return <code>true</code> if the thread calling read can be released.
   */
  public boolean read();

  /**
   * Close the <code>Connection</code>.
   */
  public void close();

  // REVISIT: replace next two with PlugInFactory (implemented by ContactInfo
  // and Acceptor).

  /**
   * Get the
   * {@link com.sun.corba.se.pept.transport.Acceptor Acceptor}
   * that created this <code>Connection</code>.
   *
   * @return {@link com.sun.corba.se.pept.transport.Acceptor Acceptor}
   */
  public Acceptor getAcceptor();

  /**
   * Get the
   * {@link com.sun.corba.se.pept.transport.ContactInfo ContactInfo}
   * that created this <code>Connection</code>.
   *
   * @return {@link com.sun.corba.se.pept.transport.ContactInfo ContactInfo}
   */
  public ContactInfo getContactInfo();

  /**
   * Get the
   * {@link com.sun.corba.se.pept.transport.EventHandler EventHandler}
   * associated with this <code>Acceptor</code>.
   *
   * @return {@link com.sun.corba.se.pept.transport.EventHandler EventHandler}
   */
  public EventHandler getEventHandler();

  /**
   * Indicates whether a
   * {@link com.sun.corba.se.pept.transport.ContactInfo ContactInfo}
   * or a
   * {@link com.sun.corba.se.pept.transport.Acceptor Acceptor}
   * created the
   * <code>Connection</code>.
   *
   * @return <code>true</code> if <code>Connection</code> an {@link com.sun.corba.se.pept.transport.Acceptor
   * Acceptor} created the <code>Connection</code>.
   */
  public boolean isServer();

  /**
   * Indicates if the <code>Connection</code> is in the process of
   * sending or receiving a message.
   *
   * @return <code>true</code> if the <code>Connection</code> is busy.
   */
  public boolean isBusy();

  /**
   * Timestamps are used for connection management, in particular, for
   * reclaiming idle <code>Connection</code>s.
   *
   * @return the "time" the <code>Connection</code> was last used.
   */
  public long getTimeStamp();

  /**
   * Timestamps are used for connection management, in particular, for
   * reclaiming idle <code>Connection</code>s.
   *
   * @param time - the "time" the <code>Connection</code> was last used.
   */
  public void setTimeStamp(long time);

  /**
   * The "state" of the <code>Connection</code>.
   *
   * param state
   */
  public void setState(String state);

  /**
   * Grab a write lock on the <code>Connection</code>.
   *
   * If another thread already has a write lock then the calling
   * thread will block until the lock is released.  The calling
   * thread must call
   * {@link #writeUnlock}
   * when it is done.
   */
  public void writeLock();

  /**
   * Release a write lock on the <code>Connection</code>.
   */
  public void writeUnlock();

  /*
   * Send the data encoded in
   * {@link com.sun.corba.se.pept.encoding.OutputObject OutputObject}
   * on the <code>Connection</code>.
   *
   * @param outputObject
   */
  public void sendWithoutLock(OutputObject outputObject);

  /**
   * Register an invocation's
   * {@link com.sun.corba.se.pept.protocol.MessageMediator MessageMediator}
   * with the <code>Connection</code>.
   *
   * This is useful in protocols which support fragmentation.
   */
  public void registerWaiter(MessageMediator messageMediator);

  /**
   * If a message expect's a response then this method is called.
   *
   * This method might block on a read (e.g., HTTP), put the calling
   * thread to sleep while another thread read's the response (e.g., GIOP),
   * or it may use the calling thread to perform the server-side work
   * (e.g., Solaris Doors).
   */
  public InputObject waitForResponse(MessageMediator messageMediator);

  /**
   * Unregister an invocation's
   * {@link com.sun.corba.se.pept.protocol.MessageMediator MessageMediator}
   * with the <code>Connection</code>.
   */
  public void unregisterWaiter(MessageMediator messageMediator);

  public void setConnectionCache(ConnectionCache connectionCache);

  public ConnectionCache getConnectionCache();
}

// End of file.
